#include <stdio.h>
#include <string.h>
#include <iostream>
#include <vector>
#include <exception>
#include "apps.inc.h"
#include "tests.inc.h"


#define TAMBLOQUE 210
#define POS1 4
#define POS2 16
#define POS3 32


using namespace std;


void testIndiceLineal(){
	cout<<"Iniciando test Indice Lineal"<<endl;
	IndiceLineal *indice=new IndiceLineal(new PrimaryKeyPersona);
	IndiceLineal *indiceSecundario=new IndiceLineal(new PrimaryKeyPersona,new SecondaryKeyPersona,indice);


	Persona *p1, *p2, *p3, *p4, *p5, *p6, *p7, *p8, *p9, *p10, *p11, *p12;
	char nombre1[] = "primero", nombre2[] = "segundo"/*, nombre3[] = "tercero"*/,
			nombre4[] = "cuarto", nombre5[] = "quinto", nombre6[] = "sexto",
					/*nombre7[] = "septimo",*/ nombre8[] = "octavo", apellido[] = "perez";
	char dni1[] = "11111111", dni2[] = "22222222", dni3[] = "33333333", dni4[] = "44444444",
			dni5[] = "55555555", dni6[] = "66666666", dni7[] = "77777777", dni8[] = "88888888"/*,
			dni9[] = "99999999", dni10[] = "10101010"*/;

	p1 = new Persona(nombre1,apellido,dni1);
	p2 = new Persona(nombre1,apellido,dni2);
	p3 = new Persona(nombre1,apellido,dni3);
	p4 = new Persona(nombre4,apellido,dni4);
	p5 = new Persona(nombre5,apellido,dni5);
	p6 = new Persona(nombre6,apellido,dni6);
	p7 = new Persona(nombre1,apellido,dni1);
	p8 = new Persona(nombre2,apellido,dni2);
	p9 = new Persona(nombre1,apellido,dni7);
	p10 = new Persona(nombre8,apellido,dni8);
	p11 = new Persona(nombre1,apellido,dni5);
	p12 = new Persona(nombre6,apellido,dni6);

	void *dato1, *dato2, *dato3, *dato4, *dato5, *dato6, *dato7, *dato8, *dato9, *dato10, *dato11, *dato12;
	p1->serialize(&dato1,BINARIO);
	p2->serialize(&dato2,BINARIO);
	p3->serialize(&dato3,BINARIO);
	p4->serialize(&dato4,BINARIO);
	p5->serialize(&dato5,BINARIO);
	p6->serialize(&dato6,BINARIO);
	p7->serialize(&dato7,BINARIO);
	p8->serialize(&dato8,BINARIO);
	p9->serialize(&dato9,BINARIO);
	p10->serialize(&dato10,BINARIO);
	p11->serialize(&dato11,BINARIO);
	p12->serialize(&dato12,BINARIO);

	try{
		indice->Cargar((char*)dato4,4);
		indice->Cargar((char*)dato1,1);
		indice->Cargar((char*)dato2,2);
		indice->Cargar((char*)dato6,6);
		indice->Cargar((char*)dato5,5);
		indice->Cargar((char*)dato3,3);
		indiceSecundario->Cargar((char*)dato1,0);
		indiceSecundario->Cargar((char*)dato2,0);
		indiceSecundario->Cargar((char*)dato3,0);
		indiceSecundario->Cargar((char*)dato4,0);
		indiceSecundario->Cargar((char*)dato5,0);
		indiceSecundario->Cargar((char*)dato6,0);
	}
	catch(...)
	{
		cout<<"error al cargar dato unico"<<endl;
	}

	try
	{
		indice->Cargar((char*)dato1,3);
		cout<<"error al cargar dato repetido"<<endl;
	}
	catch(IndexException e)
	{
		//esta bien
	}

	try
	{
		indiceSecundario->Cargar((char*)dato1,0);
		cout<<"error al cargar dato repetido indice secundario"<<endl;
	}
	catch(IndexException e)
	{
		//esta bien
	}


	if(indice->Buscar(dni1)[0]!=1)
		cout<<"error al buscar"<<endl;
	if(indice->Buscar(dni2)[0]!=2)
		cout<<"error al buscar"<<endl;
	if(indice->Buscar(dni3)[0]!=3)
		cout<<"error al buscar"<<endl;
	if(indice->Buscar(dni4)[0]!=4)
		cout<<"error al buscar"<<endl;
	if(indice->Buscar(dni5)[0]!=5)
		cout<<"error al buscar"<<endl;
	if(indice->Buscar(dni6)[0]!=6)
		cout<<"error al buscar"<<endl;

	if(indiceSecundario->Buscar(nombre1)[0]!=1)
		cout<<"error al buscar en indice secundario"<<endl;
	if(indiceSecundario->Buscar(nombre1)[1]!=2)
		cout<<"error al buscar en indice secundario"<<endl;
	if(indiceSecundario->Buscar(nombre1)[2]!=3)
		cout<<"error al buscar en indice secundario"<<endl;
	if(indiceSecundario->Buscar(nombre4)[0]!=4)
		cout<<"error al buscar en indice secundario"<<endl;
	if(indiceSecundario->Buscar(nombre5)[0]!=5)
		cout<<"error al buscar en indice secundario"<<endl;
	if(indiceSecundario->Buscar(nombre6)[0]!=6)
		cout<<"error al buscar en indice secundario"<<endl;

	vector<unsigned int> lista=indice->Listar(dni2,dni6);

	if(lista.size()!=5)
		cout<<"error al listar"<<endl;

	for(unsigned int i=0; lista.size()>i ;i++)
	{
		if(lista[i]!=i+2)
			cout<<"error al listar"<<endl;
	}

	indice->Modificar((char*)dato1,(char*)dato7,7);
	indice->Modificar((char*)dato2,(char*)dato8,2);
	indice->Modificar((char*)dato3,(char*)dato9,3);
	indice->Modificar((char*)dato4,(char*)dato10,8);
	indice->Modificar((char*)dato5,(char*)dato11,5);
	indice->Modificar((char*)dato6,(char*)dato12,6);
	indiceSecundario->Modificar((char*)dato1,(char*)dato7,7);
	indiceSecundario->Modificar((char*)dato2,(char*)dato8,2);
	indiceSecundario->Modificar((char*)dato3,(char*)dato9,3);
	indiceSecundario->Modificar((char*)dato4,(char*)dato10,8);
	indiceSecundario->Modificar((char*)dato5,(char*)dato11,5);
	indiceSecundario->Modificar((char*)dato6,(char*)dato12,6);

	if(indice->Buscar(dni1)[0]!=7)
		cout<<"error al modificar"<<endl;
	if(indice->Buscar(dni2)[0]!=2)
		cout<<"error al modificar"<<endl;
	if(indice->Buscar(dni7)[0]!=3)
		cout<<"error al modificar"<<endl;
	if(indice->Buscar(dni8)[0]!=8)
		cout<<"error al modificar"<<endl;
	if(indice->Buscar(dni5)[0]!=5)
		cout<<"error al modificar"<<endl;
	if(indice->Buscar(dni6)[0]!=6)
		cout<<"error al modificar"<<endl;

	if(indiceSecundario->Buscar(nombre1)[0]!=7)
		cout<<"error al modificar en indice secundario"<<endl;
	if(indiceSecundario->Buscar(nombre1)[1]!=3)
		cout<<"error al modificar en indice secundario"<<endl;
	if(indiceSecundario->Buscar(nombre1)[2]!=5)
		cout<<"error al modificar en indice secundario"<<endl;
	if(indiceSecundario->Buscar(nombre2)[0]!=2)
		cout<<"error al modificar en indice secundario"<<endl;
	if(indiceSecundario->Buscar(nombre6)[0]!=6)
		cout<<"error al modificar en indice secundario"<<endl;
	if(indiceSecundario->Buscar(nombre8)[0]!=8)
		cout<<"error al modificar en indice secundario"<<endl;


	indice->Eliminar((char*)dato8);
	indiceSecundario->Eliminar((char*)dato8);

	if(indice->Buscar(dni2).size()!=0)
		cout<<"error al Eliminar"<<endl;

	if(indiceSecundario->Buscar(nombre2).size()!=0)
		cout<<"error al Eliminar en indice secundario"<<endl;

	cout<<"Terminado test Indice Lineal"<<endl<<endl;
}


void testIndiceArbolB(){
	cout<<"Iniciando test Indice ArbolB"<<endl;
	EstrategiaIndice *indice=new IndiceArbolB(new PrimaryKeyPersona);
	//EstrategiaIndice *indiceSecundario=new IndiceArbolB(new PrimaryKeyPersona,new SecondaryKeyPersona,indice);


	Persona *p1, *p2, *p3, *p4, *p5, *p6, *p7, *p8, *p9, *p10, *p11, *p12;
	char nombre1[] = "primero", nombre2[] = "segundo"/*, nombre3[] = "tercero"*/,
			nombre4[] = "cuarto", nombre5[] = "quinto", nombre6[] = "sexto",
					/*nombre7[] = "septimo",*/ nombre8[] = "octavo", apellido[] = "perez";
	char dni1[] = "11111111", dni2[] = "22222222", dni3[] = "33333333", dni4[] = "44444444",
			dni5[] = "55555555", dni6[] = "66666666", dni7[] = "77777777", dni8[] = "88888888"/*,
			dni9[] = "99999999", dni10[] = "10101010"*/;

	p1 = new Persona(nombre1,apellido,dni1);
	p2 = new Persona(nombre1,apellido,dni2);
	p3 = new Persona(nombre1,apellido,dni3);
	p4 = new Persona(nombre4,apellido,dni4);
	p5 = new Persona(nombre5,apellido,dni5);
	p6 = new Persona(nombre6,apellido,dni6);
	p7 = new Persona(nombre1,apellido,dni1);
	p8 = new Persona(nombre2,apellido,dni2);
	p9 = new Persona(nombre1,apellido,dni7);
	p10 = new Persona(nombre8,apellido,dni8);
	p11 = new Persona(nombre1,apellido,dni5);
	p12 = new Persona(nombre6,apellido,dni6);

	void *dato1, *dato2, *dato3, *dato4, *dato5, *dato6, *dato7, *dato8, *dato9, *dato10, *dato11, *dato12;
	p1->serialize(&dato1,BINARIO);
	p2->serialize(&dato2,BINARIO);
	p3->serialize(&dato3,BINARIO);
	p4->serialize(&dato4,BINARIO);
	p5->serialize(&dato5,BINARIO);
	p6->serialize(&dato6,BINARIO);
	p7->serialize(&dato7,BINARIO);
	p8->serialize(&dato8,BINARIO);
	p9->serialize(&dato9,BINARIO);
	p10->serialize(&dato10,BINARIO);
	p11->serialize(&dato11,BINARIO);
	p12->serialize(&dato12,BINARIO);

	try{
		indice->Cargar((char*)dato4,4);
		indice->Cargar((char*)dato1,1);
		indice->Cargar((char*)dato2,2);
		indice->Cargar((char*)dato6,6);
		indice->Cargar((char*)dato5,5);
		indice->Cargar((char*)dato3,3);
		/*indiceSecundario->Cargar((char*)dato1,0);
		indiceSecundario->Cargar((char*)dato2,0);
		indiceSecundario->Cargar((char*)dato3,0);
		indiceSecundario->Cargar((char*)dato4,0);
		indiceSecundario->Cargar((char*)dato5,0);
		indiceSecundario->Cargar((char*)dato6,0);*/
	}
	catch(...)
	{
		cout<<"error al cargar dato unico"<<endl;
	}

	try
	{
		indice->Cargar((char*)dato1,3);
		cout<<"error al cargar dato repetido"<<endl;
	}
	catch(IndexException e)
	{
		//esta bien
	}

	try
	{
		/*indiceSecundario->Cargar((char*)dato1,0);
		cout<<"error al cargar dato repetido indice secundario"<<endl;*/
	}
	catch(IndexException e)
	{
		//esta bien
	}


	if(indice->Buscar(dni1)[0]!=1)
		cout<<"error al buscar"<<endl;
	if(indice->Buscar(dni2)[0]!=2)
		cout<<"error al buscar"<<endl;
	if(indice->Buscar(dni3)[0]!=3)
		cout<<"error al buscar"<<endl;
	if(indice->Buscar(dni4)[0]!=4)
		cout<<"error al buscar"<<endl;
	if(indice->Buscar(dni5)[0]!=5)
		cout<<"error al buscar"<<endl;
	if(indice->Buscar(dni6)[0]!=6)
		cout<<"error al buscar"<<endl;

	/*if(indiceSecundario->Buscar(nombre1)[0]!=1)
		cout<<"error al buscar en indice secundario"<<endl;
	if(indiceSecundario->Buscar(nombre1)[1]!=2)
		cout<<"error al buscar en indice secundario"<<endl;
	if(indiceSecundario->Buscar(nombre1)[2]!=3)
		cout<<"error al buscar en indice secundario"<<endl;
	if(indiceSecundario->Buscar(nombre4)[0]!=4)
		cout<<"error al buscar en indice secundario"<<endl;
	if(indiceSecundario->Buscar(nombre5)[0]!=5)
		cout<<"error al buscar en indice secundario"<<endl;
	if(indiceSecundario->Buscar(nombre6)[0]!=6)
		cout<<"error al buscar en indice secundario"<<endl;*/



	indice->Modificar((char*)dato1,(char*)dato7,7);
	indice->Modificar((char*)dato2,(char*)dato8,2);
	indice->Modificar((char*)dato3,(char*)dato9,3);
	indice->Modificar((char*)dato4,(char*)dato10,8);
	indice->Modificar((char*)dato5,(char*)dato11,5);
	indice->Modificar((char*)dato6,(char*)dato12,6);
	/*indiceSecundario->Modificar((char*)dato1,(char*)dato7,7);
	indiceSecundario->Modificar((char*)dato2,(char*)dato8,2);
	indiceSecundario->Modificar((char*)dato3,(char*)dato9,3);
	indiceSecundario->Modificar((char*)dato4,(char*)dato10,8);
	indiceSecundario->Modificar((char*)dato5,(char*)dato11,5);
	indiceSecundario->Modificar((char*)dato6,(char*)dato12,6);*/

	if(indice->Buscar(dni1)[0]!=7)
		cout<<"error al modificar"<<endl;
	if(indice->Buscar(dni2)[0]!=2)
		cout<<"error al modificar"<<endl;
	if(indice->Buscar(dni7)[0]!=3)
		cout<<"error al modificar"<<endl;
	if(indice->Buscar(dni8)[0]!=8)
		cout<<"error al modificar"<<endl;
	if(indice->Buscar(dni5)[0]!=5)
		cout<<"error al modificar"<<endl;
	if(indice->Buscar(dni6)[0]!=6)
		cout<<"error al modificar"<<endl;

	/*if(indiceSecundario->Buscar(nombre1)[0]!=7)
		cout<<"error al modificar en indice secundario"<<endl;
	if(indiceSecundario->Buscar(nombre1)[1]!=3)
		cout<<"error al modificar en indice secundario"<<endl;
	if(indiceSecundario->Buscar(nombre1)[2]!=5)
		cout<<"error al modificar en indice secundario"<<endl;
	if(indiceSecundario->Buscar(nombre2)[0]!=2)
		cout<<"error al modificar en indice secundario"<<endl;
	if(indiceSecundario->Buscar(nombre6)[0]!=6)
		cout<<"error al modificar en indice secundario"<<endl;
	if(indiceSecundario->Buscar(nombre8)[0]!=8)
		cout<<"error al modificar en indice secundario"<<endl;*/


	indice->Eliminar((char*)dato8);
	//indiceSecundario->Eliminar((char*)dato8);

	if(indice->Buscar(dni2).size()!=0)
		cout<<"error al Eliminar"<<endl;

	/*if(indiceSecundario->Buscar(nombre2).size()!=0)
		cout<<"error al Eliminar en indice secundario"<<endl;*/

	cout<<"Terminado test Indice ArbolB"<<endl<<endl;

}


void testBloqueMemoria(){
	Persona *p1, *p2;
	char nombre1[] = "juan", nombre2[] = "lucas", apellido[] = "perez";
	char dni1[] = "12345668", dni2[] = "12345677";
			
	p1 = new Persona(nombre1,apellido,dni1);
	p2 = new Persona(nombre2,apellido,dni2);
	
	
}


void testBloque(){
	Persona *p1, *p2;
	char nombre1[] = "juan", nombre2[] = "lucas", apellido[] = "perez";
	char dni1[] = "12345668", dni2[] = "12345677";
		
	p1 = new Persona(nombre1,apellido,dni1);
	p2 = new Persona(nombre2,apellido,dni2);
	
	
	void *dato1, *dato2;
	p1->serialize(&dato1,BINARIO);
	p2->serialize(&dato2,BINARIO);
	
	FILE *fp;
	fp = fopen("../archivoBloque.bin","rb+");	
	
	ComponenteAlmacenamiento *reg1, *reg2;
	fseek(fp,30,SEEK_SET);
	reg1 = new RegistroDisco(FIJA,p1->getTamanio(BINARIO),fp,p1);
	fseek(fp,150,SEEK_SET);
	reg2 = new RegistroDisco(FIJA,p2->getTamanio(BINARIO),fp,p2);
	
	Bloque *b;
	fseek(fp,0,SEEK_SET);
	b = new BloqueDisco(FIJA,TAMBLOQUE,fp,1);
	try{
		b->addComponente(reg1);
		b->addComponente(reg2);
		b->escribir(BINARIO);
	}
	catch(CompuestoException *e){
		printf("%s",e->what());
	}
	
	Persona *p3, *p4;
	p3 = new Persona();
	p4 = new Persona();
	
	ComponenteAlmacenamiento *reg3, *reg4;
	fseek(fp,30,SEEK_SET);
	reg3 = new RegistroDisco(FIJA,p3->getTamanio(BINARIO),fp);
	fseek(fp,150,SEEK_SET);
	reg4 = new RegistroDisco(FIJA,p4->getTamanio(BINARIO),fp);
	
	reg3->leer(p3,BINARIO);
	reg4->leer(p4,BINARIO);
	printf("DISCO\n");
	p3->print();
	printf("\n");
	p4->print();
	printf("\n");
	
	ComponenteAlmacenamiento *reg5,*reg6;
	Persona *p5,*p6;
	p5 = new Persona();
	p6 = new Persona();
	reg5 = b->getComponenteAt(0);
	reg6 = b->getComponenteAt(1);
	reg5->leer(p5,BINARIO);
	reg6->leer(p6,BINARIO);
	printf("DISCO\n");
	p5->print();
	printf("\n");
	p6->print();
	printf("\n");
	
	char *bloque;
	b->leer(&bloque,BINARIO);
	int i;
	for(i=0;i<TAMBLOQUE;i++)
		printf("%X",bloque[i]);
	printf("\n");
	
	
	fclose(fp);
	
	delete(b);
	delete(bloque);
	delete(reg1);
	delete(reg2);
	free(dato1);
	free(dato2);
	delete(p1);
	delete(p2);
	delete(reg3);
	delete(reg4);
	delete(p3);
	delete(p4);
	delete(reg5);
	delete(reg6);
	delete(p5);
	delete(p6);
}

void test(){
	Persona *p1, *p2;
	char nombre1[] = "juan", nombre2[] = "lucas", apellido[] = "perez";
	char dni1[] = "12345668", dni2[] = "12345677";
		
	p1 = new Persona(nombre1,apellido,dni1);
	p2 = new Persona(nombre2,apellido,dni2);
	
	char *bloque;	
	bloque = (char*) malloc(TAMBLOQUE+1);
	memset(bloque, 255, TAMBLOQUE);
		
	void *dato1, *dato2;
	p1->serialize(&dato1,BINARIO);
	p2->serialize(&dato2,BINARIO);
	
	FILE *fp;
	fp = fopen("../archivo.bin","rb+");
	
	fwrite(bloque,TAMBLOQUE,1,fp);
	fseek(fp,SEEK_SET,0);
	
	ComponenteAlmacenamiento *reg1, *reg2;
	reg1 = new RegistroDisco(FIJA,p1->getTamanio(BINARIO),fp,p1);
	reg2 = new RegistroDisco(FIJA,p2->getTamanio(BINARIO),fp,p2);
	
	fseek(fp,30,SEEK_SET);
	reg1->escribir(fp,BINARIO);
	
	fseek(fp,150,SEEK_SET);
	reg2->escribir(fp,BINARIO);
	
	
	
	Persona *p3, *p4;
	p3 = new Persona();
	p4 = new Persona();
	
	ComponenteAlmacenamiento *reg3, *reg4;
	fseek(fp,30,SEEK_SET);
	reg3 = new RegistroDisco(FIJA,p3->getTamanio(BINARIO),fp);
	fseek(fp,150,SEEK_SET);
	reg4 = new RegistroDisco(FIJA,p4->getTamanio(BINARIO),fp);
	
	reg3->leer(p3,BINARIO);
	reg4->leer(p4,BINARIO);
	printf("DISCO\n");
	p3->print();
	printf("\n");
	p4->print();
	printf("\n");
	
	
	fclose(fp);
	
	free(reg1);
	free(reg2);
	free(dato1);
	free(dato2);
	free(p1);
	free(p2);
	free(reg3);
	free(reg4);
	free(p3);
	free(p4);
}

void test2(){
	Persona *p1, *p2;
	char nombre1[] = "juan", nombre2[] = "lucas", apellido[] = "perez";
	char dni1[] = "12345668", dni2[] = "12345677";
		
	p1 = new Persona(nombre1,apellido,dni1);
	p2 = new Persona(nombre2,apellido,dni2);
	
	char *bloque;	
	bloque = (char*) malloc(TAMBLOQUE+1);
	memset(bloque, 255, TAMBLOQUE);
		
	void *dato1, *dato2;
	p1->serialize(&dato1,BINARIO);
	p2->serialize(&dato2,BINARIO);
	
	void *fp;
	fp = bloque;
	
	ComponenteAlmacenamiento *reg1, *reg2;
	reg1 = new RegistroMemoria(FIJA,p1->getTamanio(BINARIO),fp,p1);
	reg2 = new RegistroMemoria(FIJA,p2->getTamanio(BINARIO),fp,p2);
	
	fp = bloque + 30;
	reg1->escribir(fp,BINARIO);
	
	fp = bloque + 150;
	reg2->escribir(fp,BINARIO);
	
	int i;
	printf("MEMORIA\n");
	for(i=0 ; i<=TAMBLOQUE ; i++){
		printf("%X",(unsigned int) *(bloque+i));
	}
	
	Persona *p3, *p4;
	p3 = new Persona();
	p4 = new Persona();
	
	ComponenteAlmacenamiento *reg3, *reg4;
	fp = bloque + 30;
	reg3 = new RegistroMemoria(FIJA,p3->getTamanio(BINARIO),fp);
	fp = bloque + 150;
	reg4 = new RegistroMemoria(FIJA,p4->getTamanio(BINARIO),fp);
	
	reg3->leer(p3,BINARIO);
	reg4->leer(p4,BINARIO);
	printf("\n");
	p3->print();
	printf("\n");
	p4->print();
	printf("\n");
		
	
	
	free(reg1);
	free(reg2);
	free(dato1);
	free(dato2);
	free(p1);
	free(p2);
	free(reg3);
	free(reg4);
	free(p3);
	free(p4);
}

void testBloqueRegistros(){
	printf("bloques de registros\n");
	Persona *p1, *p2, *p3, *p4, *p5, *p6, *p7, *p8;
	char nombre1[] = "primero", nombre2[] = "segundo", nombre3[] = "tercero",
	nombre4[] = "cuarto", nombre5[] = "quinto", nombre6[] = "sexto",
	nombre7[] = "septimo", nombre8[] = "octavo", apellido[] = "perez";
	char dni1[] = "11111111", dni2[] = "22222222", dni3[] = "33333333", dni4[] = "44444444",
	dni5[] = "55555555", dni6[] = "66666666", dni7[] = "77777777", dni8[] = "88888888";

	p1 = new Persona(nombre1,apellido,dni1);
	p2 = new Persona(nombre2,apellido,dni2);
	p3 = new Persona(nombre3,apellido,dni3);
	p4 = new Persona(nombre4,apellido,dni4);
	p5 = new Persona(nombre5,apellido,dni5);
	p6 = new Persona(nombre6,apellido,dni6);
	p7 = new Persona(nombre7,apellido,dni7);
	p8 = new Persona(nombre8,apellido,dni8);
		
		
	/* quiero:
	 * 					bloque1						bloque2
	 * 		/---------------------------/---------------------------/
	 * 		|	|	|	|	|	|	|	|	|	|	|	|	|	|	|
	 * 		  -   1   -   3   2   5   -   4   -   6   -   7   8   -
	 */	
	
	// en memoria
	
	Bloque *b1,*b2;
//	b1 = new BloqueMemoria(FIJA,TAMBLOQUE,1);
//	b2 = new BloqueMemoria(FIJA,TAMBLOQUE,2);
	
	Registro *r1,*r2,*r3,*r4,*r5,*r6,*r7,*r8;
	void* offset=NULL;
	b1->getAccesoDato(&offset);
	offset = (char*) offset + 30;
	r1 = new RegistroMemoria(FIJA,p1->getTamanio(BINARIO),offset,p1);
	offset = (char*) offset + 60;
	r3 = new RegistroMemoria(FIJA,p3->getTamanio(BINARIO),offset,p3);
	offset = (char*) offset + 30;
	r2 = new RegistroMemoria(FIJA,p2->getTamanio(BINARIO),offset,p2);
	offset = (char*) offset + 30;
	r5 = new RegistroMemoria(FIJA,p5->getTamanio(BINARIO),offset,p5);
	b2->getAccesoDato(&offset);
//	printf("bloque2: %X\n",(unsigned int)offset);
	r4 = new RegistroMemoria(FIJA,p4->getTamanio(BINARIO),offset,p4);
	offset = (char*) offset + 60;
	r6 = new RegistroMemoria(FIJA,p6->getTamanio(BINARIO),offset,p6);
	offset = (char*) offset + 60;
	r7 = new RegistroMemoria(FIJA,p7->getTamanio(BINARIO),offset,p7);
	offset = (char*) offset + 30;
	r8 = new RegistroMemoria(FIJA,p8->getTamanio(BINARIO),offset,p8);
	
	b1->addComponente(r1);
	b1->addComponente(r2);
	b1->addComponente(r3);
	b1->addComponente(r5);
	b2->addComponente(r4);
	b2->addComponente(r6);
	b2->addComponente(r7);
	b2->addComponente(r8);
	
	char *bloque1=NULL,*bloque2=NULL;
	
	try{
		b1->escribir(BINARIO);
		b2->escribir(BINARIO);
	
		b1->leer(&bloque1,BINARIO);
		b2->leer(&bloque2,BINARIO);
	}
	catch(exception &e){
		printf("%s",e.what());
	}
	
	int i;
	for(i=0;i<TAMBLOQUE;i++)
		printf("%X",bloque1[i]);
	printf("\n");
	for(i=0;i<TAMBLOQUE;i++)
		printf("%X",bloque2[i]);
	printf("\n");
	
		
//	*/	
	return;
	
	delete(r1);
	delete(r2);
	delete(r3);
	delete(r4);
	delete(r5);
	delete(r6);
	delete(r7);
	delete(r8);
	delete(b1);
	delete(b2);
	delete(p1);
	delete(p2);
	delete(p3);
	delete(p4);
	delete(p5);
	delete(p6);
	delete(p7);
	delete(p8);
		
}

void testCubo(){
	Cubo* c1=new Cubo(0,1);
	if (c1->estaVacio()){
		cout << "El Cubo se encuentra vacia" << endl;
	}
	c1->InsertarClave(100);
	c1->InsertarClave(200);
	c1->InsertarClave(300);
	c1->InsertarClave(400);
	c1->EliminarClave(400);
	for (unsigned int i=0; i<(c1->getClaves()->size()); i++){
		cout << c1->getClaves()->operator [](i) << endl;
	}
	delete c1;
}

/**void testOrdenamiento(){
	Bloque *b1,*b2,*b3,*b4;
	b1 = new BloqueMemoria(FIJA,TAMBLOQUE,1);
	b2 = new BloqueMemoria(FIJA,TAMBLOQUE,2);
	b3 = new BloqueMemoria(FIJA,TAMBLOQUE,3);
	b4 = new BloqueMemoria(FIJA,TAMBLOQUE,4);
	
	Compuesto *c;
	c = new Compuesto();
	c->addComponente(b3);
	c->addComponente(b2);
	c->addComponente(b4);
	c->addComponente(b1);
	
	//c->ordenar(DESCENDENTE);
	int i;
	for(i=0;i<c->getCantidadComponentes();i++){
		printf("bloque %d\n",c->getComponenteAt(i)->getId());
	}
	
	
}**/

int main(){
	//escribirFijo();
	//leerFijo();
	//moverMemoria();
	//test();		// disco
	//test2();		// memoria
	//testBloque();
	testIndiceLineal();
	//testBloqueRegistros();
	//testOrdenamiento();
	testCubo();
	testIndiceArbolB();



	cout<<"Termino el test"<<endl;
	return 0;
}
